package com.study.readerwriter;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import org.junit.Test;

/**
* @Name: BufferedReaderWriterTest
* @Description: 高效字符流测试类
* @Author: 李超	lc_jack@foxmail.com
* @CreateDate: 2017-1-15 下午9:10:39 
* @Version: V1.0
 */
public class BufferedReaderWriterTest {

	/**
	* @Name: bufferedWriter
	* @Description: 高效写入字符流测试方法
	* 说明：
	* 	BufferedReader类：将文本写入字符输出流，缓冲各个字符，从而提供单个字符、数组和字符串的高效写入。 可以指定缓冲区的大小，或者接受默认的大小。在大多数情况下，默认值就足够大了。 
	* 构造方法：
	* 	BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的缓冲字符输出流。
	* 	BufferedWriter(Writer out, int sz) 创建一个使用给定大小输出缓冲区的新缓冲字符输出流。
	* 写数据方法：
	* 	public void write(int c)	写入单个字符。 
	* 	public void write(char cbuf[])	写入一个字符数组
	* 	public void write(char[] cbuf, int off, int len) 写入字符数组的某一部分。 
	* 	public void write(String str) 写入一个字符串
		public void write(String s, int off, int len) 写入字符串的某一部分。 
		public void newLine() 写入一个行分隔符。行分隔符字符串由系统属性 line.separator 定义，并且不一定是单个新行 ('\n') 符。 
		public void flush() 刷新该流的缓冲。 
	    释放资源：
	    public void close() 关闭此流，但要先刷新它。在关闭该流之后，再调用 write() 或 flush() 将导致抛出 IOException。关闭以前关闭的流无效。 
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-15 下午9:14:37
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void bufferedWriter() throws IOException {
		//创建高效字符写入流对象
		BufferedWriter writer = new BufferedWriter(new FileWriter("fos3.txt")) ;
		//写数据
		//写入单个字符
//		char ch = 'a' ;
//		writer.write(ch) ; //fos3.txt:	a
		//写入一个字符数组
//		char[] cbuf = {'a', 'b', 'c', 'd', 'e'} ;
//		writer.write(cbuf) ; //fos3.txt:	abcde
		//写入字符数组的一部分
//		writer.write(cbuf, 1, 3) ; //fos3.txt:	bcd
		//写入一个字符串
		String data = "hello, BufferedWriter." ;
		writer.write(data) ; //fos3.txt:	hello, BufferedWriter.
		//写入字符串的一部分
//		writer.write(data, 1, 4) ; //fos3.txt:	ello
		//写入一个行分割符
		writer.newLine() ;
		//刷新缓冲
		writer.flush() ;
		//释放资源
		writer.close() ;
	}
	
	/**
	* @Name: bufferedReader
	* @Description: 高效读取字符流测试方法
	* 说明：
	* 	BufferedReader类：从字符输入流中读取文本，缓冲各个字符，从而实现字符、数组和行的高效读取。 可以指定缓冲区的大小，或者可使用默认的大小。大多数情况下，默认值就足够大了。 
	* 	构造方法：
	* 		BufferedReader(Reader in)  创建一个使用默认大小输入缓冲区的缓冲字符输入流。
	* 		BufferedReader(Reader in, int sz) 创建一个使用指定大小输入缓冲区的缓冲字符输入流。
	* 	读数据方法：
	* 		public int read() 读取单个字符。 
	* 			返回作为一个整数（其范围从 0 到 65535 (0x00-0xffff)）读入的字符，如果已到达流末尾，则返回 -1 
	* 		public int read(char cbuf[]) 读取一个字符数组
	* 			返回读取的字符数，如果已到达流末尾，则返回 -1 
	* 		public int read(char cbuf[], int offset, int length) 读入字符数组的某一部分。 
	* 			返回读取的字符数，如果已到达流末尾，则返回 -1 
	* 		public String readLine() 读取一个文本行。通过下列字符之一即可认为某行已终止：换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。
	* 			返回包含该行内容的字符串，不包含任何行终止符，如果已到达流末尾，则返回 null 
	*	释放资源；
	*		public void close() 关闭该流并释放与之关联的所有资源。在关闭该流后，再调用 read()、ready()、mark()、reset() 或 skip() 将抛出 IOException。关闭以前关闭的流无效。
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-1-15 下午9:27:08
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void bufferedReader() throws IOException {
		//创建高效字符读取流对象
		BufferedReader reader = new BufferedReader(new FileReader("fos2.txt")) ;
		//读取数据
		//一次读取单个字符
//		int ch = 0 ;
//		while((ch = reader.read()) != -1) {
//			System.out.print((char)ch);
//		}
		//一次读取一个字符数组
//		char[] cbuf = new char[1024] ;
//		int len = 0 ;
//		while((len = reader.read(cbuf)) != -1) {
//			System.out.print(new String(cbuf, 0, len));
//		}
		//一次读取一个文本行
		String line = null ;
		while((line = reader.readLine()) != null) {
			System.out.println(line);
		}
		//释放资源
		reader.close() ;
	}
	
	
}
